package datasource

import (
	_ "github.com/go-sql-driver/mysql" //不能忘记导入
	"github.com/go-xorm/xorm"
	"github.com/topaz-h/iris-web/model"
	"github.com/topaz-h/iris-web/tools"
)

// NewMysqlEngine 实例化数据库引擎方法：mysql的数据引擎
func NewMysqlEngine() *xorm.Engine {
	config := tools.GetConfig()
	database := config.Database
	dsn := database.Username + ":" + database.Password + "@tcp(" + database.Host + ":" + database.Port + ")/" + database.DbName + "?charset=" + database.Charset + "&parseTime=true&loc=Local"
	//数据库引擎
	engine, err := xorm.NewEngine(database.Driver, dsn)

	//根据实体创建表
	//err = engine.CreateTables(new(model.Admin))

	// xorm框架的engine数据库引擎，提供了engine.Sync()方法，允许开发者将自定义的结构体同步到数据库中。
	// 随着xorm框架不断更新和迭代，在Sync方法的基础上，又提供了Sync2方法，用于将结构体同步更新到数据库中。
	/**
	* 自动检测和创建表，这个检测是根据表的名字
	* 自动检测和新增表中的字段，这个检测是根据字段名，同时对表中多余的字段给出警告信息
	* 自动检测，创建和删除索引和唯一索引，这个检测是根据索引的一个或多个字段名，而不根据索引名称。因此这里需要注意，如果在一个有大量数据的表中引入新的索引，数据库可能需要一定的时间来建立索引。
	* 自动转换varchar字段类型到text字段类型，自动警告其它字段类型在模型和数据库之间不一致的情况。
	* 自动警告字段的默认值，是否为空信息在模型和数据库之间不匹配的情况
	 */
	//Sync2是Sync的基础上优化的方法
	err = engine.Sync2(
		// new(model.Permission),
		// new(model.City),
		// new(model.Admin),
		// new(model.AdminPermission),
		new(model.User),
	)

	if err != nil {
		panic(err.Error())
	}

	// 是否显示SQL语句（开发调试时使用）
	engine.ShowSQL(true)
	// 设置数据库最大连接数
	engine.SetMaxOpenConns(10)
	// 设置最大空闲连接数量：默认是2
	engine.SetMaxIdleConns(5)

	return engine
}
